前兩天已經完成第一版 Memory Pipeline。
Day 09 解決的是:
AI 要怎麼記住一件事情?
Day 10 解決的是:
AI 要怎麼在需要的時候想起它?
但做到這裡,又出現一個新的問題:
如果使用者改變了呢?
人的偏好、習慣和生活狀態都不是永遠固定的。
例如之前使用者說:
我晚上很喜歡出去散步。
Memory 裡可能存成:
{
"type": "preference",
"content": "晚上喜歡散步"
}
但過了一段時間,使用者又說:
最近晚上比較不想出去走了。
如果系統只是一直新增 Memory,就可能同時存在:
晚上喜歡散步
晚上不想出去散步
下一次 Retrieval 時,反而不知道哪一個才是現在的狀態。
所以今天要處理的是:
Memory Update、Conflict 與 Forgetting。
第一版 Memory 最簡單的做法是:
Conversation
↓
Memory Extraction
↓
Insert Database
但真正的 Long-term Memory 不能只有 Insert。
新的資訊進來之後,還需要先和過去相關的 Memory 比較:
New Memory
↓
Retrieve Related Memory
↓
Compare
↓
Insert / Update / Merge / Replace
也就是在存進資料庫之前,多一層判斷。
例如原本有:
晚上喜歡散步
新的對話卻是:
最近晚上比較不想出去走了
這時候不應該單純再新增第二筆 Memory。
因為兩句話描述的是同一個「散步偏好」,只是使用者現在的狀態改變了。
因此可以把原本的 Memory 更新成:
{
"type": "preference",
"content": "最近晚上較少散步",
"updated_at": "..."
}
讓下一次 Retrieval 優先取得比較新的狀態。
目前我先把 Memory 的更新分成幾種情況。
同一件事情的狀態改變:
喜歡晚上散步
↓
最近比較少晚上散步
更新原本的 Memory。
新的資訊是在補充原本的資訊:
喜歡散步
+
通常晚餐後散步
↓
喜歡在晚餐後散步
把兩筆資訊整合成更完整的 Memory。
新的資訊明確取代原本的資訊:
最喜歡喝咖啡
↓
現在比較喜歡喝茶
這時舊資訊就不應該繼續被當成目前主要偏好。
做到 Memory Update 之後,Memory 不能只有:
type
content
還需要加入一些時間資訊,例如:
created_at
updated_at
last_accessed_at
因為「以前喜歡散步」和「最近喜歡散步」,即使 Semantic Search 看起來非常相似,代表的狀態其實不同。
因此之後 Retrieval 也不能只看:
Semantic Similarity
還可以進一步考慮:
Similarity
+
Recency
+
Importance
讓比較新、比較重要的 Memory 更容易被取回。
不是所有 Memory 都需要永久保留。
例如:
今天下午想喝珍珠奶茶
可能過幾天就沒有太大的價值。
但:
平常喜歡喝無糖茶
就比較像長期偏好。
因此 Memory 可以加入:
importance
last_accessed_at
expires_at
讓低重要性、具有時效性,而且長時間沒有被使用的 Memory,慢慢降低 Retrieval 的權重。
這裡的「遺忘」也不一定代表直接從資料庫 Delete。
第一版可以先做到:
讓已經不重要的 Memory 越來越不容易被 Retrieval 找回來。
做到這裡,也發現 General Memory 和 Health Memory 不能完全使用相同的更新方式。
General Memory 比較常描述:
偏好
習慣
人物關係
生活資訊
這些資訊通常比較重視「現在的狀態」。
例如:
以前晚上喜歡散步
↓
最近不太散步
可以透過 Update 或 Replace 更新。
但 Health Memory 不太一樣。
例如:
Day 1:昨天睡不好
Day 3:今天睡得好多了
這兩筆資訊看起來不同,但其實沒有互相衝突。
因為它們描述的是:
不同時間點的健康狀態。
所以 Health Memory 不應該直接把:
睡不好
Replace 成:
睡得很好
而是保留下來:
Day 1 → 睡眠狀況差
Day 3 → 睡眠狀況改善
形成一條 Health Timeline。
這樣未來才有可能觀察:
睡眠
飲食
活動
身體不適
用藥
↓
不同時間點的 Health Memory
↓
長期狀態變化
加入今天的處理之後,目前 Memory Pipeline 變成:
Conversation
↓
Memory Extraction
↓
Related Memory Retrieval
↓
Memory Comparison
↓
Insert / Update / Merge / Replace
↓
Memory Store
↓
New Conversation
↓
Memory Retrieval
↓
LLM Context
到這裡,Memory 不再只是把資訊一直存進資料庫,而是開始能根據新的對話,判斷要新增、更新、合併還是取代原本的記憶。
而 General Memory 與 Health Memory 也開始出現不同的方向:
General Memory
↓
維護目前狀態
Health Memory
↓
保留時間序列
↓
觀察狀態變化
下一步,就可以正式把 Health Memory 獨立出來,開始記錄使用者一段時間內的健康狀態變化。